# 代码执行流程说明：
# 正向传播阶段：
# 第一层计算：苹果单价 × 数量 = 100 × 2 = 200
# 第二层计算：税前价格 × 税率 = 200 × 1.1 = 220
# 反向传播阶段：
# 从最终价格开始反向传播梯度（初始梯度dprice=1）
# 税费层反向传播：计算对税前价格和税率的梯度
# 数量层反向传播：计算对单价和数量的梯度
# 梯度验证：
# 对单价的梯度=∂price/∂apple=num×tax=2×1.1=2.2
# 对数量的梯度=∂price/∂num=apple×tax=100×1.1=110
# 对税率的梯度=∂price/∂tax=apple×num=100×2=200
# 这个简单示例展示了神经网络中：
# 如何通过计算图组织运算
# 正向传播计算预测值
# 反向传播自动计算梯度
# 梯度值的实际意义解释

# 指定文件编码为UTF-8
# coding: utf-8

"""
buy_apple.py 功能说明：
1. 演示使用乘法层(MulLayer)实现购买苹果的价格计算
2. 包含正向传播(计算总价)和反向传播(计算梯度)过程
3. 模拟场景：购买苹果(单价100元)2个，消费税1.1倍

关键点：
- 使用两个乘法层分别处理数量和税费
- 展示计算图的正向/反向传播机制
- 验证梯度计算是否正确
- 为后续复杂神经网络的反向传播提供基础示例
"""

# 从layer_naive模块导入所有类和方法
from layer_naive import *

# 定义初始参数
apple = 100       # 苹果单价
apple_num = 2     # 购买数量
tax = 1.1         # 消费税税率

# 创建乘法层实例
mul_apple_layer = MulLayer()  # 数量乘法层
mul_tax_layer = MulLayer()    # 税费乘法层

# ========== 正向传播 ===# ... 省略其他代码 ...


# ==== 修改后代码 ====
# 计算苹果总价（单价 × 数量）
apple_price = mul_apple_layer.forward(apple, apple_num)
# 计算含税总价（税前价格 × 税率）
price = mul_tax_layer.forward(apple_price, tax)

# ========== 反向传播 ===# ... 省略其他代码 ...


# ==== 修改后代码 ====
# 从最终价格开始反向传播（初始梯度为1）
dprice = 1
# 计算税费乘法层的梯度
dapple_price, dtax = mul_tax_layer.backward(dprice)
# 计算数量乘法层的梯度
dapple, dapple_num = mul_apple_layer.backward(dapple_price)

# 打印结果
print("price:", int(price))             # 打印含税总价
print("dApple:", dapple)                # 打印单价梯度
print("dApple_num:", int(dapple_num))   # 打印数量梯度
print("dTax:", dtax)                    # 打印税率梯度

"""
预期输出分析：
price: 220          # 100*2*1.1=220
dApple: 2.2         # 对单价的偏导数 = 数量*税率 = 2*1.1
dApple_num: 110     # 对数量的偏导数 = 单价*税率 = 100*1.1
dTax: 200           # 对税率的偏导数 = 单价*数量 = 100*2
"""
